<?php

namespace app;

use config\Mysql;
use config\Redis;
use \GatewayWorker\Lib\Gateway;

class Base
{
    //执行的函数 
    private $func = ['ping', 'demo'];
    //限流--每秒最多处理20次
    private $limit = 20;
    //会员对象池
    public static $poos = [];
    /**
     * 校验接口
     */
    protected function checkType($type)
    {
        return in_array((string)$type, $this->func, true);
    }

    /**
     * 校验会员
     */
    protected function checkAuth($data, $client_id)
    {
        //校验是否合法会员
        if (!(array_key_exists('uid', $data) && ($user = Gateway::getSession($client_id)) && (string)$user['uid'] === (string)$data['uid'])) {
            Gateway::closeClient($client_id);
            return false;
        }
        return true;
    }

    /**
     * mysql
     */
    protected function db()
    {
        return  Mysql::getInstance();
    }

    /**
     * redis
     */
    protected function redis()
    {
        return Redis::getInstance();
    }

    /**
     * 设置会员
     */
    private static function setPlayer($uid)
    {
        if (array_key_exists($uid, self::$poos) === false) {
            //加文件锁--防止并发 多次实例player对象
            $file = fopen(__DIR__ . '/lock_set_player.txt', 'w+');
            if (flock($file, LOCK_EX)) { //阻塞模式（后面的进程会一直等待前面的进程执行完毕）
                if (array_key_exists($uid, self::$poos) === true) {
                    return self::$poos[$uid];
                }
                $user = new User();
                $user->uid = $uid;
                $user->setInfo();
                self::$poos[$uid] = $user;
                flock($file, LOCK_UN); //解锁
            }
            //关闭文件
            fclose($file);
        }
        return self::$poos[$uid];
    }

    /**
     * 获取玩家
     */
    public static function getPlayer($uid)
    {
        return self::setPlayer($uid);
    }

    /**
     * 过滤函数
     */
    protected  function filter($str)
    {
        if (empty($str)) return false;
        $str = htmlspecialchars($str);
        $str = str_replace('/', "", $str);
        $str = str_replace('"', "", $str);
        $str = str_replace('(', "", $str);
        $str = str_replace(')', "", $str);
        $str = str_replace('CR', "", $str);
        $str = str_replace('ASCII', "", $str);
        $str = str_replace('ASCII 0x0d', "", $str);
        $str = str_replace('LF', "", $str);
        $str = str_replace('ASCII 0x0a', "", $str);
        $str = str_replace(',', "", $str);
        $str = str_replace('%', "", $str);
        $str = str_replace(';', "", $str);
        $str = str_replace('eval', "", $str);
        $str = str_replace('open', "", $str);
        $str = str_replace('sysopen', "", $str);
        $str = str_replace('system', "", $str);
        $str = str_replace('$', "", $str);
        $str = str_replace("'", "", $str);
        $str = str_replace("'", "", $str);
        $str = str_replace('ASCII 0x08', "", $str);
        $str = str_replace('"', "", $str);
        $str = str_replace('"', "", $str);
        $str = str_replace("", "", $str);
        $str = str_replace("&gt", "", $str);
        $str = str_replace("&lt", "", $str);
        $str = str_replace("<SCRIPT>", "", $str);
        $str = str_replace("</SCRIPT>", "", $str);
        $str = str_replace("<script>", "", $str);
        $str = str_replace("</script>", "", $str);
        $str = str_replace("select", "", $str);
        $str = str_replace("join", "", $str);
        $str = str_replace("union", "", $str);
        $str = str_replace("where", "", $str);
        $str = str_replace("insert", "", $str);
        $str = str_replace("delete", "", $str);
        $str = str_replace("update", "", $str);
        $str = str_replace("like", "", $str);
        $str = str_replace("drop", "", $str);
        $str = str_replace("DROP", "", $str);
        $str = str_replace("create", "", $str);
        $str = str_replace("modify", "", $str);
        $str = str_replace("rename", "", $str);
        $str = str_replace("alter", "", $str);
        $str = str_replace("cas", "", $str);
        $str = str_replace("&", "", $str);
        $str = str_replace(">", "", $str);
        $str = str_replace("<", "", $str);
        $str = str_replace(" ", chr(32), $str);
        $str = str_replace(" ", chr(9), $str);
        $str = str_replace("    ", chr(9), $str);
        $str = str_replace("&", chr(34), $str);
        $str = str_replace("'", chr(39), $str);
        $str = str_replace("<br />", chr(13), $str);
        $str = str_replace("''", "'", $str);
        $str = str_replace("css", "'", $str);
        $str = str_replace("CSS", "'", $str);
        $str = str_replace("<!--", "", $str);
        $str = str_replace("convert", "", $str);
        $str = str_replace("md5", "", $str);
        $str = str_replace("passwd", "", $str);
        $str = str_replace("password", "", $str);
        $str = str_replace("../", "", $str);
        $str = str_replace("./", "", $str);
        $str = str_replace("Array", "", $str);
        $str = str_replace("or 1='1'", "", $str);
        $str = str_replace(";set|set&set;", "", $str);
        $str = str_replace("`set|set&set`", "", $str);
        $str = str_replace("--", "", $str);
        $str = str_replace("OR", "", $str);
        $str = str_replace('"', "", $str);
        $str = str_replace("*", "", $str);
        $str = str_replace("-", "", $str);
        $str = str_replace("+", "", $str);
        $str = str_replace("/", "", $str);
        $str = str_replace("=", "", $str);
        $str = str_replace("'/", "", $str);
        $str = str_replace("-- ", "", $str);
        $str = str_replace(" -- ", "", $str);
        $str = str_replace(" --", "", $str);
        $str = str_replace("(", "", $str);
        $str = str_replace(")", "", $str);
        $str = str_replace("{", "", $str);
        $str = str_replace("}", "", $str);
        $str = str_replace(".", "", $str);
        $str = str_replace("response", "", $str);
        $str = str_replace("write", "", $str);
        $str = str_replace("|", "", $str);
        $str = str_replace("`", "", $str);
        $str = str_replace(";", "", $str);
        $str = str_replace("etc", "", $str);
        $str = str_replace("root", "", $str);
        $str = str_replace("//", "", $str);
        $str = str_replace("!=", "", $str);
        $str = str_replace("$", "", $str);
        $str = str_replace("&", "", $str);
        $str = str_replace("&&", "", $str);
        $str = str_replace("==", "", $str);
        $str = str_replace("#", "", $str);
        $str = str_replace("@", "", $str);
        $str = str_replace("mailto:", "", $str);
        $str = str_replace("CHAR", "", $str);
        $str = str_replace("char", "", $str);
        return $str;
    }

    /**
     * 限流
     */

    protected function checkLimit()
    {
        $time = time();
        if (empty($_SESSION['uid_limit'])) {
            $_SESSION['uid_limit'] = ['num' => $this->limit, 'limit_time' => $time + 1];
        }
        if ($time > $_SESSION['uid_limit']['limit_time']) {
            $_SESSION['uid_limit'] = ['num' => $this->limit, 'limit_time' => $time + 1];
        }
        $_SESSION['uid_limit']['num'] -= 1;
        return $_SESSION['uid_limit']['num'] > 0;
    }
}
